package utils

import (
	"fmt"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"sync"
	"time"
)

var Logger *zap.Logger

var once sync.Once

const FILE_MODEL = false

func GetLogger() *zap.Logger {
	if FILE_MODEL {
		// 使用NewProductionEncoderConfig但开启颜色支持，模拟Development行为
		once.Do(func() {
			// 日志文件路径及前缀
			logPath := "./logs/app"
			// 指定日志文件名格式，%Y%m%d%H%M表示年月日时分
			fileName := fmt.Sprintf("%s-%s.log", logPath, "%Y%m%d%H%M")

			// 设置日志切割选项
			rotator, err := rotatelogs.New(
				fileName,
				rotatelogs.WithLinkName(logPath), // 生成软链，指向最新日志文件
				rotatelogs.WithMaxAge(24*7*time.Hour),  // 文件最大保存时间，这里是7天
				rotatelogs.WithRotationSize(1024*1024), // 文件大小达到1M时分割
			)
			if err != nil {
				fmt.Println("Failed to create rotatelogs:", err)
				os.Exit(1)
			}

			// 构建zap encoder配置
			encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

			// 构建zap core
			core := zapcore.NewCore(encoder, zapcore.AddSync(rotator), zap.InfoLevel)

			// 构建logger
			Logger = zap.New(core)
		})
	} else {
		Logger, _ = zap.NewProduction()
	}
	return Logger
}
func init() {
	GetLogger()
}
